//进行axios二次封装:使用请求与响应拦截器
import axios from "axios";
import { ElMessage } from "element-plus";
//引入用户相关的仓库
import useUserStore from "@/store/modules/user";
//第一步:利用axios对象的create方法,去创建axios实例(其他的配置:基础路径、超时的时间)
let request = axios.create({
     //基础路径
     baseURL: import.meta.env.VITE_APP_BASE_API,//基础路径上会携带/api
     timeout: 10000//超时的时间的设置，增加到10秒
});
//第二步:request实例添加请求与响应拦截器
request.interceptors.request.use((config) => {
     //获取用户相关的小仓库:获取仓库内部token,登录成功以后携带给服务器
     let userStore = useUserStore();
     if (userStore.token) {
          config.headers.token = userStore.token
     }
     //config配置对象,headers属性请求头,经常给服务器端携带公共参数
     //返回配置对象
     return config;
}, (error) => {
     //请求错误处理
     ElMessage({
          type: 'error',
          message: '请求发送失败'
     });
     return Promise.reject(error);
});

//第三步:响应拦截器
request.interceptors.response.use((response) => {
     //成功回调
     //简化数据
     return response.data;
}, (error) => {
     //失败回调:处理http网络错误的
     //定义一个变量:存储网络错误信息
     let message = '';
     //http状态码
     let status = error.response?.status;
     switch (status) {
          case 401:
               message = "TOKEN过期，请重新登录"
               // 清除用户信息并跳转到登录页
               const userStore = useUserStore();
               userStore.token = '';
               userStore.username = '';
               userStore.avatar = '';
               userStore.buttons = [];
               localStorage.removeItem('TOKEN');
               window.location.href = '/login';
               break;
          case 403:
               message = "无权访问"
               break;
          case 404:
               message = "请求地址错误";
               break;
          case 500:
               message = "服务器出现问题"
               break;
          case 502:
               message = "网关错误"
               break;
          case 503:
               message = "服务不可用"
               break;
          case 504:
               message = "网关超时"
               break;
          default:
               if (error.code === 'ECONNABORTED') {
                    message = "请求超时，请检查网络连接";
               } else if (error.message.includes('Network Error')) {
                    message = "网络连接失败，请检查网络设置";
               } else {
                    message = "网络出现问题";
               }
               break;
     }
     //提示错误信息
     ElMessage({
          type: 'error',
          message,
          duration: 3000
     });
     return Promise.reject(error);
});
//对外暴露
export default request;